﻿// using System;
// using System.Windows.Media.Animation;
//
// namespace KinonekoSoftware.Foundation.UI.Controls.Containers
// {
//     public class FlexibleView : ContentControl
//     {
//         static FlexibleView()
//         {
//             DefaultStyleKeyProperty.OverrideMetadata(typeof(FlexibleView), new FrameworkPropertyMetadata(typeof(FlexibleView)));
//         }
//
//         private static readonly object DefaultWidth = 280d;
//
//
//         #region LeftView
//
//         public static readonly DependencyProperty LeftViewProperty = DependencyProperty.Register(
//             nameof(LeftView),
//             typeof(object),
//             typeof(FlexibleView),
//             new PropertyMetadata(default(object)));
//
//         public static readonly DependencyProperty LeftViewTemplateProperty = DependencyProperty.Register(
//             nameof(LeftViewTemplate),
//             typeof(DataTemplate),
//             typeof(FlexibleView),
//             new PropertyMetadata(default(DataTemplate)));
//
//         /// <summary>
//         /// 实现 <see cref="LeftViewTemplateSelector"/> 属性的依赖属性。
//         /// </summary>
//         public static readonly DependencyProperty LeftViewTemplateSelectorProperty = DependencyProperty.Register(
//             nameof(LeftViewTemplateSelector),
//             typeof(DataTemplateSelector),
//             typeof(FlexibleView),
//             new PropertyMetadata(default(DataTemplateSelector)));
//
//         /// <summary>
//         /// 实现 <see cref="LeftViewStringFormat"/> 属性的依赖属性。
//         /// </summary>
//         public static readonly DependencyProperty LeftViewStringFormatProperty = DependencyProperty.Register(
//             nameof(LeftViewStringFormat),
//             typeof(string),
//             typeof(FlexibleView),
//             new PropertyMetadata(default(string)));
//
//
//         /// <summary>
//         /// 获取或设置 <see cref="LeftViewStringFormat"/> 属性。
//         /// </summary>
//         public string LeftViewStringFormat
//         {
//             get => (string)GetValue(LeftViewStringFormatProperty);
//             set => SetValue(LeftViewStringFormatProperty, value);
//         }
//
//         /// <summary>
//         /// 获取或设置 <see cref="LeftViewTemplateSelector"/> 属性。
//         /// </summary>
//         public DataTemplateSelector LeftViewTemplateSelector
//         {
//             get => (DataTemplateSelector)GetValue(LeftViewTemplateSelectorProperty);
//             set => SetValue(LeftViewTemplateSelectorProperty, value);
//         }
//
//         /// <summary>
//         /// 获取或设置 <see cref="LeftViewTemplate"/> 属性。
//         /// </summary>
//         public DataTemplate LeftViewTemplate
//         {
//             get => (DataTemplate)GetValue(LeftViewTemplateProperty);
//             set => SetValue(LeftViewTemplateProperty, value);
//         }
//
//         /// <summary>
//         /// 获取或设置 <see cref="LeftView"/> 属性。
//         /// </summary>
//         public object LeftView
//         {
//             get => GetValue(LeftViewProperty);
//             set => SetValue(LeftViewProperty, value);
//         }
//
//         #endregion
//
//         #region RightView
//
//         public static readonly DependencyProperty RightViewProperty = DependencyProperty.Register(
//             nameof(RightView),
//             typeof(object),
//             typeof(FlexibleView),
//             new PropertyMetadata(default(object)));
//
//         public static readonly DependencyProperty RightViewTemplateProperty = DependencyProperty.Register(
//             nameof(RightViewTemplate),
//             typeof(DataTemplate),
//             typeof(FlexibleView),
//             new PropertyMetadata(default(DataTemplate)));
//
//         /// <summary>
//         /// 实现 <see cref="RightViewTemplateSelector"/> 属性的依赖属性。
//         /// </summary>
//         public static readonly DependencyProperty RightViewTemplateSelectorProperty = DependencyProperty.Register(
//             nameof(RightViewTemplateSelector),
//             typeof(DataTemplateSelector),
//             typeof(FlexibleView),
//             new PropertyMetadata(default(DataTemplateSelector)));
//
//         /// <summary>
//         /// 实现 <see cref="RightViewStringFormat"/> 属性的依赖属性。
//         /// </summary>
//         public static readonly DependencyProperty RightViewStringFormatProperty = DependencyProperty.Register(
//             nameof(RightViewStringFormat),
//             typeof(string),
//             typeof(FlexibleView),
//             new PropertyMetadata(default(string)));
//
//
//         /// <summary>
//         /// 获取或设置 <see cref="RightViewStringFormat"/> 属性。
//         /// </summary>
//         public string RightViewStringFormat
//         {
//             get => (string)GetValue(RightViewStringFormatProperty);
//             set => SetValue(RightViewStringFormatProperty, value);
//         }
//
//         /// <summary>
//         /// 获取或设置 <see cref="RightViewTemplateSelector"/> 属性。
//         /// </summary>
//         public DataTemplateSelector RightViewTemplateSelector
//         {
//             get => (DataTemplateSelector)GetValue(RightViewTemplateSelectorProperty);
//             set => SetValue(RightViewTemplateSelectorProperty, value);
//         }
//
//         /// <summary>
//         /// 获取或设置 <see cref="RightViewTemplate"/> 属性。
//         /// </summary>
//         public DataTemplate RightViewTemplate
//         {
//             get => (DataTemplate)GetValue(RightViewTemplateProperty);
//             set => SetValue(RightViewTemplateProperty, value);
//         }
//
//         /// <summary>
//         /// 获取或设置 <see cref="RightView"/> 属性。
//         /// </summary>
//         public object RightView
//         {
//             get => GetValue(RightViewProperty);
//             set => SetValue(RightViewProperty, value);
//         }
//
//         #endregion
//
//
//         public static readonly DependencyProperty IsLeftViewOpenProperty = DependencyProperty.Register(
//             nameof(IsLeftViewOpen),
//             typeof(bool),
//             typeof(FlexibleView),
//             new PropertyMetadata(Boxing.False, OnLeftViewOpen));
//
//         public static readonly DependencyProperty IsRightViewOpenProperty = DependencyProperty.Register(
//             nameof(IsRightViewOpen),
//             typeof(bool),
//             typeof(FlexibleView),
//             new PropertyMetadata(Boxing.False, OnRightViewOpen));
//
//
//         public static readonly DependencyProperty InsideLeftPaneWidthProperty = DependencyProperty.Register(
//             nameof(InsideLeftPaneWidth),
//             typeof(double),
//             typeof(FlexibleView),
//             new PropertyMetadata(DefaultWidth));
//
//
//         public static readonly DependencyProperty InsideRightPanelWidthProperty = DependencyProperty.Register(
//             nameof(InsideRightPanelWidth),
//             typeof(double),
//             typeof(FlexibleView),
//             new PropertyMetadata(DefaultWidth));
//
//         private static void OnLeftViewOpen(DependencyObject d, DependencyPropertyChangedEventArgs e)
//         {
//             if (e.NewValue is bool b && b)
//             {
//                 if (d.GetValue(IsRightViewOpenProperty) is bool b2 && b2)
//                 {
//                     ClosePane(d, false);
//                     //
//                     // 关闭右边的面板
//                     d.SetCurrentValue(IsRightViewOpenProperty, Boxing.False);
//
//                 }
//
//                 OpenPane(d, true);
//             }
//             else
//             {
//                 ClosePane(d, true);
//             }
//         }
//
//         private static void OnRightViewOpen(DependencyObject d, DependencyPropertyChangedEventArgs e)
//         {
//             if (e.NewValue is bool b && b)
//             {
//                 if (d.GetValue(IsLeftViewOpenProperty) is bool b2 && b2)
//                 {
//                     ClosePane(d, true);
//                     //
//                     // 关闭左边的面板
//                     d.SetCurrentValue(IsLeftViewOpenProperty, Boxing.False);
//                 }
//
//
//                 OpenPane(d, false);
//             }
//             else
//             {
//                 ClosePane(d, false);
//             }
//         }
//
//         private static void ClosePane(DependencyObject d, bool left)
//         {
//             var fv = (FlexibleView)d;
//             var v = left ? fv.InsideLeftPaneWidth : fv.InsideRightPanelWidth;
//             var animation = new DoubleAnimation
//             {
//                 To = 0,
//                 From = v,
//                 Duration = new Duration(TimeSpan.FromMilliseconds(v / 1.2)),
//             };
//
//
//             if (left && fv._LeftPane is not null)
//             {
//                 Storyboard.SetTarget(animation, fv._LeftPane);
//                 Storyboard.SetTargetProperty(animation, new PropertyPath("(FrameworkElement.Width)"));
//
//                 fv._storyboard?.Stop();
//                 fv._storyboard = new Storyboard
//                 {
//                     Children = new TimelineCollection { animation }
//                 };
//                 fv.BeginStoryboard(fv._storyboard, HandoffBehavior.SnapshotAndReplace, true);
//             }
//             else if (fv._RightPane is not null)
//             {
//                 Storyboard.SetTarget(animation, fv._RightPane);
//                 Storyboard.SetTargetProperty(animation, new PropertyPath("(FrameworkElement.Width)"));
//
//                 fv._storyboard?.Stop();
//                 fv._storyboard = new Storyboard
//                 {
//                     Children = new TimelineCollection { animation }
//                 };
//                 fv.BeginStoryboard(fv._storyboard, HandoffBehavior.SnapshotAndReplace, true);
//             }
//         }
//
//         private static void OpenPane(DependencyObject d, bool left)
//         {
//             var fv = (FlexibleView)d;
//             var v = left ? fv.InsideLeftPaneWidth : fv.InsideRightPanelWidth;
//             var animation = new DoubleAnimation
//             {
//                 From = 0,
//                 To = v,
//                 Duration = new Duration(TimeSpan.FromMilliseconds(v / 1.2)),
//             };
//
//
//             if (left && fv._LeftPane is not null)
//             {
//                 Storyboard.SetTarget(animation, fv._LeftPane);
//                 Storyboard.SetTargetProperty(animation, new PropertyPath("(FrameworkElement.Width)"));
//
//                 fv._storyboard?.Stop();
//                 fv._storyboard = new Storyboard
//                 {
//                     Children = new TimelineCollection { animation }
//                 };
//                 fv.BeginStoryboard(fv._storyboard, HandoffBehavior.SnapshotAndReplace, true);
//             }
//             else if (fv._RightPane is not null)
//             {
//                 Storyboard.SetTarget(animation, fv._RightPane);
//                 Storyboard.SetTargetProperty(animation, new PropertyPath("(FrameworkElement.Width)"));
//
//                 fv._storyboard?.Stop();
//                 fv._storyboard = new Storyboard
//                 {
//                     Children = new TimelineCollection { animation }
//                 };
//                 fv.BeginStoryboard(fv._storyboard, HandoffBehavior.SnapshotAndReplace, true);
//             }
//         }
//
//         private Storyboard _storyboard;
//         private ContentPresenter _LeftPane;
//         private ContentPresenter _RightPane;
//
//         public override void OnApplyTemplate()
//         {
//             _LeftPane = GetTemplateChild("PART_Left") as ContentPresenter;
//             _RightPane = GetTemplateChild("PART_Right") as ContentPresenter;
//
//             base.OnApplyTemplate();
//         }
//
//         public double InsideRightPanelWidth
//         {
//             get => (double)GetValue(InsideRightPanelWidthProperty);
//             set => SetValue(InsideRightPanelWidthProperty, value);
//         }
//         public double InsideLeftPaneWidth
//         {
//             get => (double)GetValue(InsideLeftPaneWidthProperty);
//             set => SetValue(InsideLeftPaneWidthProperty, value);
//         }
//
//
//
//         public bool IsRightViewOpen
//         {
//             get => (bool)GetValue(IsRightViewOpenProperty);
//             set => SetValue(IsRightViewOpenProperty, Boxing.Box(value));
//         }
//
//         public bool IsLeftViewOpen
//         {
//             get => (bool)GetValue(IsLeftViewOpenProperty);
//             set => SetValue(IsLeftViewOpenProperty, Boxing.Box(value));
//         }
//     }
// }